<?php
// Inkluderar filer.
require_once 'InstallView.php';
require_once 'InstallHandler.php';
require_once 'DatabaseConnection.php';
require_once 'ErrorView.php';

class InstallController
{	
	public $m_isInstalled = false;
	public $m_testNotes = "test_notes";
	public $m_testUsers = "test_users";
	
	public function doControll()
	{
		// Instansierar objekt.
		$InstallView = new InstallView();
		$InstallHandler = new InstallHandler();
		$ErrorView = new ErrorView();
		
		$xhtml = "<h1>Installera Notes</h1>";
				
		// Har användaren försökt installera?
		if ($InstallView->triedToInstallDatabase() == true)
		{
			// Array som håller alla fältnamn som skall valideras.
			$fieldsToValidateArray = array("dbHost", "dbName", "dbUsername", "dbPassword", "adminUsername", "adminPassword");
			
			// Loppar igenom Array:en och validerar datat.
			for ($i = 0; $i < count($fieldsToValidateArray); $i++)
			{
				// Kontrollerar om någon av fälten returnerar false.
				if($InstallView->validateField($fieldsToValidateArray[$i]) == false)
				{
					// Skriver ut felmeddelande.
					$xhtml .= $ErrorView->showErrorMessage("Fel vid validering av " . $fieldsToValidateArray[$i], "error");
				}
			}
			
			// Har användaren valt att skapa en ny databas? 
			if ($InstallView->createNewDatabase() == true)
			{
				// Skapar ett objekt av DatabaseConnection, utan någon databas.
				$database = new DatabaseConnection($InstallView->getdbHost(),
				$InstallView->getdbUsername(), $InstallView->getdbPassword(), "", $InstallView->getdbPrefix());
				
				// Ansluter till databasservern utan någon databas.
				if ($database->connect() == false)
				{
					$xhtml .= $ErrorView->showMessage(4, "error");
				}
				
				// Skapa en ny databas.
				if ($InstallHandler->createDatabase($database, $InstallView->getdbName()) == false)
				{
					// Kunde inte skapa databasen
					$xhtml .= $ErrorView->showErrorMessage("Kunde inte skapa databasen.", "error");
				}
			}
			else
			{
				// Skapar ett objekt av DatabaseConnection, utan någon databas.
				$database = new DatabaseConnection($InstallView->getdbHost(),
				$InstallView->getdbUsername(), $InstallView->getdbPassword(),
				$InstallView->getdbName(), $InstallView->getdbPrefix());
				
				// Ansluter till databasservern utan någon databas.
				if ($database->connect() == false)
				{
					$xhtml .= $ErrorView->showMessage(4, "error");
				}	
			}
			
			// Väljer vilken databas som skall användas.
			if ($InstallHandler->UseDatabase($database, $InstallView->getdbName()) == false)
			{
				$xhtml .= $ErrorView->showErrorMessage("Kunde inte välja databas", "error");
			}
			
			// skapar tabllerna.
			if ($InstallHandler->createTable($database, "users", $InstallView->usePrefix(),
			$InstallView->getdbPrefix()) == false)
			{
				$xhtml .= $ErrorView->showErrorMessage("Tabellen '".$InstallView->getdbPrefix()."users' kunde inte skapas.", "error");
			}
			
			// skapar tabllerna.
			if ($InstallHandler->createTable($database, "notes", $InstallView->usePrefix(),
			$InstallView->getdbPrefix()) == false)
			{
				$xhtml .= $ErrorView->showErrorMessage("Tabellen '".$InstallView->getdbPrefix()."notes' kunde inte skapas.", "error");
			}
			
			// Kolla om test_tabellerna ska skapas.
			if ($InstallView->wantsToCreateTestTables() == true)
			{
				// Skapa test_tabellerna.
				if ($InstallHandler->createTestNotesTable($database, $this->m_testNotes) == false)
				{
					$xhtml .= $ErrorView->showErrorMessage("Tabellen 'test_notes' kunde inte skapas.", "error");					
				}
				
				if ($InstallHandler->createTestUsersTable($database, $this->m_testUsers) == false)
				{
					$xhtml .= $ErrorView->showErrorMessage("Tabellen 'test_users' kunde inte skapas.", "error");					
				}
				
			}
			
			
			// Skickar in alla uppgifter för att spara dem till Settings.php
			$InstallHandler->saveDatabaseSettingsToFile($InstallView->getdbHost(), $InstallView->getdbUsername(),
			$InstallView->getdbPassword(), $InstallView->getdbName(), $InstallView->getdbPrefix());
			
			// Skapa Administrator i tabellen (prefix)user.
			if ($InstallHandler->createAdminUser($database, $InstallView->getAdminUsername(), 
			$InstallView->getAdminPassword(), $InstallView->getdbPrefix()) == false)
			{
				$xhtml .= $ErrorView->showErrorMessage("Kunde inte skapa användaren.", "error");
			}
			else
			{
				$this->m_isInstalled = true;
			}
			
			// kollar om installationen är klar.
			if ($this->m_isInstalled == true)
			{
				return $ErrorView->showErrorMessage("Installationen lyckades. <a href='index.php'>Logga In</a>", "good");
			}
			
			// Stänger kopplingen till databasen.
			$database->Close();
		}
		
		// Presenterar ett formulär för inmatning, och instruktioner.
		$xhtml .= $InstallView->doInstallForm().$InstallView->showInstallInstructions();
	
		return $xhtml;
	}
}